package com.example.chamberlainserver.Service;

import com.example.chamberlainserver.Entry.Material;
import com.example.chamberlainserver.Vo.Request.Material.MaterialQuery;
import com.example.chamberlainserver.dto.PageResult;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 物资服务接口
 */
public interface MaterialService {
    
    /**
     * 添加物资
     * @param material 物资信息
     * @return 添加后的物资信息
     */
    Material addMaterial(Material material);
    
    /**
     * 更新物资信息
     * @param material 物资信息
     * @return 更新后的物资信息
     */
    Material updateMaterial(Material material);
    
    /**
     * 删除物资
     * @param id 物资ID
     * @return 是否删除成功
     */
    boolean deleteMaterial(Long id);
    
    /**
     * 根据ID查询物资
     * @param id 物资ID
     * @return 物资信息
     */
    Material getMaterialById(Long id);
    
    /**
     * 获取所有物资
     * @return 物资列表
     */
    List<Material> getAllMaterials();
    
    /**
     * 根据分类ID获取物资
     * @param categoryId 分类ID
     * @return 物资列表
     */
    List<Material> getMaterialsByCategory(Integer categoryId);
    
    /**
     * 根据存放位置ID获取物资
     * @param locationId 存放位置ID
     * @return 物资列表
     */
    List<Material> getMaterialsByLocation(Integer locationId);
    
    /**
     * 根据物资名称搜索物资
     * @param name 物资名称关键字
     * @return 物资列表
     */
    List<Material> searchMaterialsByName(String name);
    
    /**
     * 获取库存不足的物资
     * @return 物资列表
     */
    List<Material> getLowStockMaterials();
    
    /**
     * 更新物资库存
     * @param id 物资ID
     * @param quantity 新的库存数量
     * @return 更新后的物资信息
     */
    Material updateMaterialStock(Long id, Integer quantity);
    
    /**
     * 更新物资盘点时间
     * @param id 物资ID
     * @param inventoryTime 盘点时间
     * @return 更新后的物资信息
     */
    Material updateInventoryTime(Long id, LocalDateTime inventoryTime);
    
    /**
     * 分页查询物资列表
     * @param materialQuery 查询条件
     * @return 分页结果
     */
    PageResult<Material> getPagedMaterialList(MaterialQuery materialQuery);
}